import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;

import javax.microedition.io.Connector;
import javax.microedition.io.file.FileConnection;
import javax.microedition.media.Manager;
import javax.microedition.media.Player;
import javax.microedition.media.control.RecordControl;

import net.rim.blackberry.api.phone.Phone;
import net.rim.blackberry.api.phone.PhoneCall;
import net.rim.blackberry.api.phone.PhoneListener;
import net.rim.device.api.system.Application;
import net.rim.device.api.ui.component.Dialog;

public class CatchCall extends Application implements PhoneListener {
	
	Player player;
	RecordControl recorder;
	private ByteArrayOutputStream output;
	byte[] data;
	boolean yes = false;
	int st;
	
	public CatchCall() {
		Phone.addPhoneListener(this);
	}

	public static void main(String[] args) {
		new CatchCall().enterEventDispatcher();
	}

	public void callAdded(int callId) {
	}

	public void callAnswered(int callId) {
	}

	public void callConferenceCallEstablished(int callId) {
	}

	public void callConnected(int callId) {

		// TODO Auto-generated method s
		PhoneCall phoneCall = Phone.getCall(callId);
		if (phoneCall != null) {
			if (yes)
				initPlay();
		}
	}

	public void callDirectConnectConnected(int callId) {
	}

	public void callDirectConnectDisconnected(int callId) {
	}

	public void callDisconnected(int callId) {
		// TODO Auto-generated method stub
		if (yes) {
			try {
				recorder.commit();

			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			player.close();
			data = output.toByteArray();
			saveRecordedFile(data);
		}
	}

	public void callEndedByUser(int callId) {
	}

	public void callFailed(int callId, int reason) {
	}

	public void callHeld(int callId) {
	}

	public void callIncoming(int callId) {
		Dialog.ask(Dialog.D_YES_NO, "Are u sure to record this call");
	}

	public void callInitiated(int callid) {

		PhoneCall phoneCall = Phone.getCall(callid);
		if (phoneCall != null) {
			st = Dialog.ask(Dialog.D_YES_NO, "Are u sure to record this call");
			if (st == Dialog.YES)
				yes = true;
			else
				yes = false;
		}
	
	}

	public void callRemoved(int callId) {
	}

	public void callResumed(int callId) {
	}

	public void callWaiting(int callid) {
	}

	public void conferenceCallDisconnected(int callId) {
	}
	
	private void initPlay() {
		try {
			player = Manager.createPlayer("capture://audio");
			player.realize();
			recorder = (RecordControl) player.getControl("RecordControl");
			output = new ByteArrayOutputStream();
			recorder.setRecordStream(output);
			recorder.startRecord();
			player.start();
		} catch (Exception e) {
			Dialog.alert(e + "");
		}

	}

	public static boolean saveRecordedFile(byte[] data) {
		try {
			String filePath1 = System.getProperty("fileconn.dir.music");
			String fileName = "Call Recorder(";
			boolean existed = true;
			for (int i = 0; i < Integer.MAX_VALUE; i++) {
				try {
					FileConnection fc = (FileConnection) Connector.open(filePath1 + fileName + i + ").amr");
					if (!fc.exists()) {
						existed = false;
					}
					fc.close();
				} catch (IOException e) {
					Dialog.alert("unable to save");
					return existed;
				}
				if (!existed) {
					fileName += i + ").amr";
					filePath1 += fileName;
					break;
				}
			}
			System.out.println(filePath1);
			System.out.println("");
			FileConnection fconn = (FileConnection) javax.microedition.io.Connector .open(filePath1, javax.microedition.io.Connector.READ_WRITE);
			if (fconn.exists())
				fconn.delete();
			fconn.create();

			OutputStream outputStream = fconn.openOutputStream();
			outputStream.write(data);
			outputStream.close();
			fconn.close();
			return true;
		} catch (Exception e) {
		}
		return false;
	}
}